package com.masita.logica;

import java.sql.*;
import java.util.Vector;

import com.masita.util.Utilidad;

public class Producto {
	
	private int id_producto;
	private String codigo;
	private String texto;
	
	private int id_categoria;	// apunta a la tabla categoria
	private int id_tipo;		// apunta a la tabla tipo
	private int id_marca;		// apunta a la tabla marca
	
	private String imagen;
	private double precio_costo;
	private double porcentaje;	// porcentaje que se aplica a la venta
	
	private Vector talles;
		
	public Producto(int id, String codigo, String tex, int id_cat,
					int id_tip, int id_m, String img,
					double p, double porc){
		
		this.id_producto = id;
		this.codigo = new String(codigo);
		this.texto = new String(tex);
		this.id_categoria = id_cat;
		this.id_tipo = id_tip;
		this.id_marca = id_m;
		this.imagen = new String(img);
		this.precio_costo = p;
		this.porcentaje = porc;
		
		this.talles = null;
	}

	// METODOS GET ****************************************
	public String getCodigo(){
		return this.codigo;
	}

	public int getIdCategoria(){
		return id_categoria;
	}

	public int getIdProducto(){
		return id_producto;
	}

	public int getIdTipo(){
		return id_tipo;
	}

	public String getImagen(){
		return imagen;
	}

	public int getIdMarca(){
		return this.id_marca;
	}
	
	public double getPrecioCosto(){
		return precio_costo;
	}
	
	public Vector getTalles(){
		if( this.talles == null )
			this.talles = TalleProducto.getTallesProducto(this.id_producto);
		return this.talles;
	}
	
	public TalleProducto getTalle(int id_t){
		if( this.getTalles() != null ){
			for( int i=0; i<this.talles.size(); i++){
				if( ((TalleProducto)talles.elementAt(i)).getIdTalle() == id_t )
					return (TalleProducto)talles.elementAt(i);
			}
		}
		return null;
	}

	public TalleProducto getTalle(String nom){
		if( this.getTalles() != null ){
			for( int i=0; i<this.talles.size(); i++){
				if( ((TalleProducto)talles.elementAt(i)).esIgual(nom) )
					return (TalleProducto)talles.elementAt(i);
			}
		}
		return null;
	}

	public String getTexto(){
		return texto;
	}

	// METODOS SET ****************************************
	public void setCodigo(String l){
		codigo = new String(l);
	}

	public void setIdCategoria(int i){
		id_categoria = i;
	}

	public void setIdTipo(int i){
		id_tipo = i;
	}

	public void setIdMarca(int i){
		id_marca = i;
	}

	public void setImagen(String string){
		imagen = new String(string);
	}

	public void setPrecioCosto(double d){
		precio_costo = d;
	}

	public void setTexto(String string){
		texto = new String(string);
	}
	
	// METODO ADD Y REMOVE DE TALLES PARA LA CLASE ********
	
	private TalleProducto perteneceTalle(TalleProducto talle){
		for( int i=0; i<this.getTalles().size(); i++){
			if( ((TalleProducto)this.talles.elementAt(i)).esIgual(talle.getTalle()) )
				return (TalleProducto)this.talles.elementAt(i);
		}
		return null;
	}
	// SI EL TALLE NO EXISTE LO AGREGA A LA LISTA SINO ACTUALIZA EL STOCK
	public void addTalle(TalleProducto t){
		if( this.getTalles() == null )
			this.talles = new Vector();
		
		TalleProducto talle = this.perteneceTalle(t);
		if( talle == null )
			this.talles.addElement(t);
		else
			talle.setStock(t.getStock());			
	}
	
	public void removeTalle(TalleProducto t){
		if( this.getTalles() != null ){
			if( this.talles.indexOf(t) != -1)
				this.talles.removeElement(t);
		}
	}
	
	// METODO PARA ACTUALIZAR EL STOCK DE TALLES **********
	public void addStock(int id_t, int dif){
		TalleProducto talle = this.getTalle(id_t);
		if( talle != null )
			talle.addStock(dif);
	}

	public void removeStock(int id_t, int dif){
		TalleProducto talle = this.getTalle(id_t);
		if( talle != null )
			talle.removeStock(dif);
	}
	
	// OBTENER UN PRODUCTO DE LA BASE DE DATOS ************
	public static Producto getProducto(int id){
		try{
			Statement st = Conexion.getStatement();
			String sentencia = "SELECT * FROM producto WHERE id_producto = "+id;
			ResultSet rs = st.executeQuery(sentencia);
			
			if( rs.next() )
				return new Producto(rs.getInt("id_producto"), 
						   rs.getString("codigo"), rs.getString("texto"),
						   rs.getInt("id_categoria"), rs.getInt("id_tipo"),
						   rs.getInt("id_marca"), rs.getString("imagen"),
						   rs.getDouble("precio_costo"),
						   rs.getDouble("porcentaje"));
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return null;
	}

	public static Producto getProductoPorCodigo(String cod){
		try{
			Statement st = Conexion.getStatement();
			String sentencia = "SELECT * FROM producto "+							   "WHERE codigo = '"+cod+"'";
			ResultSet rs = st.executeQuery(sentencia);
			
			if( rs.next() )
				return new Producto(rs.getInt("id_producto"), 
						   rs.getString("codigo"), rs.getString("texto"),
						   rs.getInt("id_categoria"), rs.getInt("id_tipo"),
						   rs.getInt("id_marca"), rs.getString("imagen"),
						   rs.getDouble("precio_costo"),
						   rs.getDouble("porcentaje"));
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return null;
	}

	public static Vector getProductos(){
		Vector productos = null;
		try{
			Statement st = Conexion.getStatement();
			String sentencia = "SELECT * FROM producto";
			ResultSet rs = st.executeQuery(sentencia);
			
			while( rs.next() ){
				if( productos == null ) productos = new Vector();
				productos.addElement( new Producto(rs.getInt("id_producto"), 
									  rs.getString("codigo"), rs.getString("texto"),
									  rs.getInt("id_categoria"), rs.getInt("id_tipo"),
									  rs.getInt("id_marca"), rs.getString("imagen"),
									  rs.getDouble("precio_costo"),
									  rs.getDouble("porcentaje")));			
			}
			return productos;
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return null;
	}
	
	// GUARDAR DATOS EN LA BASE DE DATOS ******************
	
	public int guardarDatos(){
		try{
			Statement st = Conexion.getStatement();
			String sentencia;
			if( this.id_producto == 0 ){
				sentencia = "INSERT INTO producto VALUES(0,'"+this.codigo+
							"','"+this.texto+"',"+this.id_categoria+","+
							this.id_tipo+","+this.id_marca+",'"+this.imagen+
							"',"+this.precio_costo+","+this.porcentaje+")";
				st.executeUpdate(sentencia);
				ResultSet rs = st.getGeneratedKeys();
				if( rs.next() ) this.id_producto = rs.getInt(1);
			}
			else{
				sentencia = "UPDATE producto SET codigo = '"+this.codigo+
							"', texto = '"+this.texto+"', id_marca = "+
							this.id_marca+", id_categoria = "+
							this.id_categoria+", id_tipo = "+this.id_tipo+
							", imagen = '"+this.imagen+"', precio_costo = "+
							this.precio_costo+", porcentaje = "+
							this.porcentaje+" WHERE id_producto = "+
							this.id_producto;
				st.executeUpdate(sentencia);
			}
			
			if( this.talles != null ){
				for( int i=0; i<this.talles.size(); i++){
					TalleProducto talle = (TalleProducto)talles.elementAt(i);
					talle.setIdProducto(this.id_producto);
					talle.guardarDatos();
				}
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return this.id_producto;		
	}
	
	public boolean eliminar(){
		try{
			if( this.id_producto == 0 ) return false;

			if( this.getTalles() != null ){
				for( int i=0; i<this.talles.size(); i++){
					TalleProducto talle = (TalleProducto)talles.elementAt(i);
					talle.eliminar();
				}
			}

			Statement st = Conexion.getStatement();
			String sentencia = "DELETE FROM producto "+							   "WHERE id_producto = "+this.id_producto;
			st.executeUpdate(sentencia);
			
			this.id_producto = 0;
			return true;
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}		
		return false;
	}

	public double getPorcentaje(){
		return porcentaje;
	}

	public void setPorcentaje(double d){
		porcentaje = d;
	}
	
	public double getPrecioVenta(){
		double venta = getPrecioCosto() + getPrecioCosto() * getPorcentaje() /100;
		return Utilidad.getDoubleDos(venta);
	}
}
